[アップデート] Amazon VPC Lattice で TCP ターゲットと TLS リスナーが追加され、Lattice サービスで TLS 終端せずにクライアントとターゲット間のエンドツーエンド暗号化を構成出来るようになりました
いわさです。
VPC Lattice はアカウント、VPC を跨いだリバースプロキシサービスです。
Lattice のコンポーネントである「サービス」は HTTPS リスナーの機能を有しており、クライアントとの SSL 通信が可能です。
また「ターゲット」もルーティング設定として HTTP、HTTPS をサポートしています。
ただ、これまで経路全体で HTTPS を使いたい場合も、サービスで一度 TLS 終端が必要でした。
TLS パススルーをサポート
これが、先日の Lattice のアップデートで新たに TLS パススルーをサポートするようになりました。
これによって次のように Lattice で復号化せずにターゲットまで暗号化されたトラフィックを転送することが出来るようになりました。
いくつか制限事項がありますが、エンドツーエンド暗号化が要求されるようなユースケースでも Lattice が採用しやすくなります。
本日はこちらを構成して検証してみましたので紹介したいと思います。
従来の HTTPS リスナー、ターゲットを構成してみる
まずは今回のアップデート前までの構成 TLS 終端する構成を取ってみます。
あまり関係ないので詳細は割愛しますが、前述の構成図のようにクライアントは同一 VPC 内の Cloud9、ターゲットは internal な Application Load Balancer で HTTPS リスナーを構成しています。ALB のターゲットは適当な Lambda 関数です。
ALB 自体へ直接通信してみます。カスタムドメインは特に設定せずにワイルドカード証明書だけ割り当てていますので cURL の resolve オプションを使います。
hogeadmin:~/environment $ curl --resolve hoge0517curl.fuga.tak1wa.com:443:172.31.39.118 -i https://hoge0517curl.fuga.tak1wa.com/ HTTP/2 200 server: awselb/2.0 date: Thu, 16 May 2024 21:05:06 GMT content-type: application/json content-length: 15 {"hoge":"fuga"}
良いですね。
こいつをターゲットに Lattice のターゲットグループ、サービス、サービスネットワークを構成しました。
ターゲット
サービスとリスナー
サービスネットワークを構成してアクセスしてみました。
ただ、証明書は Lattice がデフォルトで発行したものが使われていますね。
hogeadmin:~/environment $ curl hogeadmin:~/environment $ curl https://hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws/ -v * URL rejected: Port number was not a decimal number between 0 and 65535 * Closing connection curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535 * URL rejected: Bad hostname * Closing connection curl: (3) URL rejected: Bad hostname * Could not resolve host: curl * Closing connection curl: (6) Could not resolve host: curl * Host hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws:443 was resolved. * IPv6: fd00:ec2:80::a9fe:ab21 * IPv4: 169.254.171.33 * Trying 169.254.171.33:443... * Connected to hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws (169.254.171.33) port 443 * ALPN: curl offers h2,http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * CAfile: /etc/pki/tls/certs/ca-bundle.crt * CApath: none * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / RSASSA-PSS * ALPN: server accepted h2 * Server certificate: * subject: CN=*.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws * start date: Feb 23 00:00:00 2024 GMT * expire date: Mar 24 23:59:59 2025 GMT * subjectAltName: host "hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws" matched cert's "*.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws" * issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M02 * SSL certificate verify ok. * Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * using HTTP/2 * [HTTP/2] [1] OPENED stream for https://hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws/ * [HTTP/2] [1] [:method: GET] * [HTTP/2] [1] [:scheme: https] * [HTTP/2] [1] [:authority: hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws] * [HTTP/2] [1] [:path: /] * [HTTP/2] [1] [user-agent: curl/8.5.0] * [HTTP/2] [1] [accept: */*] > GET / HTTP/2 > Host: hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/2 200 < server: awselb/2.0 < date: Thu, 16 May 2024 20:53:25 GMT < content-type: application/json < content-length: 15 < * Connection #1 to host hoge0517service-0e4fc37c30f276748.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws left intact {"hoge":"fuga"}
今回の TLS リスナー、TCP ターゲットを構成してみる
TLS リスナーの作成 & カスタムドメインが必須
今回のアップデートで次のようにリスナーのプロトコルタイプに TLS が追加されています。
こいつを選択すると TLS 終端せずにパススルーしてくれるようです。
ただ、非活性で選択が出来ない。
ドキュメントにいくつか前提事項が記載されておりまして、こちらはよく確認しましょう。
一番最初の条件としてカスタムドメインが必須となります。また、client-hello メッセージの SNI フィールドを使用してルーティングする仕組みなっています。
そのため、バックエンドターゲットでバインドしている SSL 証明書にあわせて Lattice サービスのカスタムドメインも設定してやる必要があります。
カスタムドメインを指定しますが、ここで SSL/TLS 証明書の指定は不要です。
TLS リスナーの場合は設定しても無視されるとのこと。
カスタムドメイン設定後に次のように TLS プロトコルリスナーを構成出来るようになりました。
また、ドキュメントに記載のとおりリスナールールは構成できずデフォルトルール(TCP ターゲットへの転送)となっています。
TCP ターゲット
前後してしまいましたが、事前に TCP ターゲットを作成しておく必要があります。
次のようにターゲットグループ作成時のプロトコルに TCP が追加されています。
ただしここでもまた非活性で選べないですね。
本日時点でターゲットタイプとしてインスタンス、IP アドレス、Lambda 関数、Application Load Balancer の 4 つが存在しているのですが、インスタンスと IP アドレスでのみ TCP プロトコルを選択することが出来ました。
ドキュメントによると Lambda 関数では選択出来ないと明記されているのですが ALB で選択出来ないとは記載されていないのですが、前述のキャプチャのとおり私が確認した限りでは ALB も選択出来ませんでした。
今回は IP アドレスターゲットとして、ALB の ENI を指定します。
アクセスしてみる
サービスとネットワークが構成出来たらまたクライアントからアクセスしてみます。
}hogeadmin:~curl --resolve hoge0517lattice.fuga.tak1wa.com:443:169.254.171.33 -v https://hoge0517lattice.fuga.tak1wa.com/ * Added hoge0517lattice.fuga.tak1wa.com:443:169.254.171.33 to DNS cache * Hostname hoge0517lattice.fuga.tak1wa.com was found in DNS cache * Trying 169.254.171.33:443... * Connected to hoge0517lattice.fuga.tak1wa.com (169.254.171.33) port 443 * ALPN: curl offers h2,http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * CAfile: /etc/pki/tls/certs/ca-bundle.crt * CApath: none * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256 / X25519 / RSASSA-PSS * ALPN: server accepted h2 * Server certificate: * subject: CN=*.fuga.tak1wa.com * start date: Apr 14 00:00:00 2024 GMT * expire date: May 13 23:59:59 2025 GMT * subjectAltName: host "hoge0517lattice.fuga.tak1wa.com" matched cert's "*.fuga.tak1wa.com" * issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M02 * SSL certificate verify ok. * Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * using HTTP/2 * [HTTP/2] [1] OPENED stream for https://hoge0517lattice.fuga.tak1wa.com/ * [HTTP/2] [1] [:method: GET] * [HTTP/2] [1] [:scheme: https] * [HTTP/2] [1] [:authority: hoge0517lattice.fuga.tak1wa.com] * [HTTP/2] [1] [:path: /] * [HTTP/2] [1] [user-agent: curl/8.5.0] * [HTTP/2] [1] [accept: */*] > GET / HTTP/2 > Host: hoge0517lattice.fuga.tak1wa.com > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/2 200 < server: awselb/2.0 < date: Thu, 16 May 2024 21:14:34 GMT < content-type: application/json < content-length: 15 < * Connection #0 to host hoge0517lattice.fuga.tak1wa.com left intact {"hoge":"fuga"}
通信出来ており、ALB 側の SSL 証明書が使われていますね。
もう少し調べることは出来そうですが、良さそうな雰囲気です。
さいごに
本日は Amazon VPC Lattice で TCP ターゲットと TLS リスナーが追加され、Lattice サービスで TLS 終端せずにクライアントとターゲット間のエンドツーエンド暗号化を構成出来るようになったので使ってみました。
実は VPC Lattice を初めて使ったので理解が浅く少し検証に戸惑いましたが、冒頭の AWS 入門ブログリレー記事のおかげでかなり助かりました。
VPC Lattice の採用例もたまに話を聞くようになってきたので、エンドツーエンドの要件も出てきそうですね。今回の機能について覚えておきたいです。
再掲しますが認証ポリシーや接続時間などの制限事項がありますので気をつけましょう。